/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int return_len(ListNode* head)
    {
        int len=0;
        ListNode* p=head;
        while(p!=nullptr)
        {
            len++;
            p=p->next;
        }
        return len;
    }
    ListNode* rotateRight(ListNode* head, int k) 
    {
        //给空直接返回空
        if(head==nullptr)
        {
            return nullptr;
        }
        //只有一个元素怎么移动都是它，直接返回head
        if(head->next==nullptr)
        {
            return head;
        }
        //计算链表长度
        int len=return_len(head);
        //mod运算保证k不大于len
        k=k%len;
        //右移次数是len的整数倍，等于没移动。直接返回head。
        if(k==0)
        {
            return head;
        }
        //
        ListNode* p=head;
        ListNode* new_head;
        new_head=head;
        int i;
        //通过计算长度将旧链表砍断。
        for(i=0;i<len;i++)
        {
            //新头前一个停下，记录新的头并把新尾巴砍断
            if(i==len-1-k)
            {
                new_head=p->next;
                //这里砍断就不能继续遍历了，要从新头开始
                p->next=nullptr;
                break;
            }   
            p=p->next;
        }
        //遍历到新头的尾巴然后连接旧头。
        p=new_head;
        while(p!=nullptr)
        {
            if(p->next==nullptr)
            {
                //旧头拼接
                p->next=head;
                break;
            }
            p=p->next;
        }
        return new_head;
    }
};